package com.EAIPClub.CodeShell.util;

import com.jcraft.jsch.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Properties;

/**
 * @Description :
 * @Author :
 * @Date : 2021/12/9
 */
@Component
@Slf4j
public class JschUtil {

    public ChannelSftp getChannel(Map<String, String> sftpDetails, int timeout) throws JSchException {

        log.info("即将开始创建Jsch对象.接受数据为:{}",sftpDetails);

        Session session = null;
        Channel channel = null;

        String ftpHost = sftpDetails.get(SFTPConstants.SFTP_REQ_HOST);
        String port = sftpDetails.get(SFTPConstants.SFTP_REQ_PORT);
        String ftpUserName = sftpDetails.get(SFTPConstants.SFTP_REQ_USERNAME);
        String ftpPassword = sftpDetails.get(SFTPConstants.SFTP_REQ_PASSWORD);

        int ftpPort = SFTPConstants.SFTP_DEFAULT_PORT;
        if (port != null && !port.equals("")) {
            log.info("检测到端口号.port:{}",port);
            ftpPort = Integer.parseInt(port);
        }

        JSch jsch = new JSch(); // 创建JSch对象
        session = jsch.getSession(ftpUserName, ftpHost, ftpPort); // 根据用户名，主机ip，端口获取一个Session对象
        log.info("Session已经创建.");
        if (ftpPassword != null) {
            log.info("检测到密码,即将使用密码.");
            session.setPassword(ftpPassword); // 设置密码
        }
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config); // 为Session对象设置properties
        session.setTimeout(timeout); // 设置timeout时间
        session.connect(); // 通过Session建立链接
        log.info("Session已经连接.");

        log.info("打开通道.");
        channel = session.openChannel("sftp"); // 打开SFTP通道
        channel.connect(); // 建立SFTP通道的连接
        log.debug("成功连接到 ftpHost = " + ftpHost + ",as ftpUserName = " + ftpUserName
                + ", returning: " + channel);
        return (ChannelSftp) channel;
    }

    public void closeChannel(Channel channel) throws Exception {
        if (channel != null) {
            channel.disconnect();
        }
    }
}
